﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using NakedObjects.Services;
using NakedObjects;
using RTC.Modelo.Entidades;
using RTC.Modelo.Entidades.DatosPersonales;
using RTC.Modelo.Entidades.EstudiosPropios;
using RTC.Modelo.Entidades.Convalidaciones;

namespace InicializadorModelo
{
    public class Inicializador : AbstractFactoryAndRepository
    {
        
        public virtual void Inicializar() {
            InicializarTipoDocumento();
            InicializarPais();
            InicializarUniversidad();
            InicializarCentroDeFormacion();
            InicializarDatosPersonales();
            InicializarRoles();
            InicializarEstudio();

            InicializarEjemplo1();

        }

        private void InicializarRoles()
        {
            if (Container.Instances<Rol>().Count() > 0)
            {
                return;
            }
            Rol rol = Container.NewTransientInstance<Rol>();
            rol.Nombre = "Administrador";
            Container.Persist<Rol>(ref rol);
            rol = Container.NewTransientInstance<Rol>();
            rol.Nombre = "";
            Container.Persist<Rol>(ref rol);
            rol = Container.NewTransientInstance<Rol>();
            rol.Nombre = "";
            Container.Persist<Rol>(ref rol);
        }

        private void InicializarTipoDocumento() {
            if (Container.Instances<TipoDocumento>().Count() > 0) {
                return;
            }

           TipoDocumento newTipo = Container.NewTransientInstance<RTC.Modelo.Entidades.TipoDocumento>();
           newTipo.Nombre = "DNI";
           Container.Persist<TipoDocumento>(ref newTipo);
           newTipo = Container.NewTransientInstance<RTC.Modelo.Entidades.TipoDocumento>();
           newTipo.Nombre = "Pasaporte";
           Container.Persist<TipoDocumento>(ref newTipo);
        }

        private void InicializarPais() {
            if (Container.Instances<Pais>().Count() > 0)
            {
                return;
            }
            var pais = Container.NewTransientInstance<Pais>();
            pais.Nombre = "España";
            Container.Persist<Pais>(ref pais);
            pais = Container.NewTransientInstance<Pais>();
            pais.Nombre = "Bolivia";
            Container.Persist<Pais>(ref pais);
            pais = Container.NewTransientInstance<Pais>();
            pais.Nombre = "Venezuela";
            Container.Persist<Pais>(ref pais);
        }
        private void InicializarUniversidad()
        {
            if (Container.Instances<Universidad>().Count() > 0)
            {
                return;
            }
            var univ = Container.NewTransientInstance<Universidad>();
            univ.Nombre = "UPM";
            
            Container.Persist<Universidad>(ref univ);
            univ = Container.NewTransientInstance<Universidad>();
            univ.Nombre = "UNIR";
            
            Container.Persist<Universidad>(ref univ);
            univ = Container.NewTransientInstance<Universidad>();
            univ.Nombre = "UAGRM";
            
            Container.Persist<Universidad>(ref univ);
        }

        private void InicializarCentroDeFormacion()
        {
            if (Container.Instances<CentroDeFormacion>().Count() > 0)
            {
                return;
            }
            var univ = Container.NewTransientInstance<CentroDeFormacion>();
            univ.Nombre = "centro 1";
            
            Container.Persist<CentroDeFormacion>(ref univ);
            univ = Container.NewTransientInstance<CentroDeFormacion>();
            univ.Nombre = "centro 2";
            
            Container.Persist<CentroDeFormacion>(ref univ);
            univ = Container.NewTransientInstance<CentroDeFormacion>();
            univ.Nombre = "centro 3";
            
            Container.Persist<CentroDeFormacion>(ref univ);
        }
        private void InicializarDatosPersonales()
        {
            if (Container.Instances<DatosPersonales>().Count() > 0)
            {
                return;
            }
            var dp = Container.NewTransientInstance<DatosPersonales>();
            dp.Nombre = "centro 1";
            dp.Apellidos = "yucra";
            dp.NroDocumento = "4669557";            
            Container.Persist<DatosPersonales>(ref dp);
            
        }


        private void InicializarEstudio() {
            if (Container.Instances<Estudio>().Count() > 0)
            {
                return;
            }
            var dp = Container.NewTransientInstance<Estudio>();
            dp.Nombre = "Estudio1";
            Container.Persist<Estudio>(ref dp);
            dp = Container.NewTransientInstance<Estudio>();
            dp.Nombre = "Estudio2";
            Container.Persist<Estudio>(ref dp);
        }

        private void InicializarAsignatura() {
            if (Container.Instances<Asignatura>().Count() > 0)
            {
                return;
            }
            var dp = Container.NewTransientInstance<Asignatura>();
            dp.Nombre = "Asignatura1";
            Container.Persist<Asignatura>(ref dp);
            dp = Container.NewTransientInstance<Asignatura>();
            dp.Nombre = "Asignatura2";
            Container.Persist<Asignatura>(ref dp);
        }



        private void InicializarEjemplo1() {

            Universidad univ = Container.NewTransientInstance<Universidad>();
            univ.Nombre = "IES Ronda (Lleida) Universidad de Lleida";
            Container.Persist<Universidad>(ref univ);

            EstudioExterno ex = Container.NewTransientInstance<EstudioExterno>();
            ex.CentroEstudioExterno = univ;
            ex.Nombre = "CFGS Educación Infantil Grado en Educación Infantil";
            Container.Persist<EstudioExterno>(ref ex);

            Estudio estudio = Container.NewTransientInstance<Estudio>();
            estudio.Nombre = "Maestro Educación Infantil";
            Container.Persist<Estudio>(ref estudio);

            GenerarConvalidacionNormal(ex, estudio, "Desarrollo psicofísico en la edad escolar y sus implicaciones pedagógicas", "Desarrollo cognitivo y motor");


            GenerarConvalidacionNormal(ex, estudio, 
                "Didáctica general",
                "Didáctica de la Educación Infantil");


            GenerarConvalidacionNormal(ex, estudio,
                "Educación y convivencia dentro y fuera del aula",
                "Familia, Escuela y Sociedad II (Grado)");


            GenerarConvalidacionNormal(ex, estudio,
                "Familia, escuela y sociedad",
                "Familia, Escuela y Sociedad I  (Grado)");
            //--------------------------------------------

           

//            
//            


//	6	B	6	 
//	6	B	6	 
//Igualdad y diversidad escolar y  social	6	B	6	Intervención con las familias y atención a menores en riesgo social




//    Expresión plástica	4	OB	4	Expresión y comunicación
//Autoconocimiento y autonomía personal en la educación infantil	4	OB	4	Autonomía personal y salud




            GenerarConvalidacionOptativa(ex, estudio,  "Metodología del Juego");
            GenerarConvalidacionOptativa(ex, estudio, "Habilidades Sociales");
            GenerarConvalidacionOptativa(ex, estudio, "Primeros Auxilios");
            GenerarConvalidacionOptativa(ex, estudio, "Empresa e Iniciativa Emprendedora");
            GenerarConvalidacionOptativa(ex, estudio, "Aprendizaje de las Ciencias Sociales (Grado)");

        }

        private void GenerarConvalidacionOptativa(EstudioExterno ex, Estudio estudio, String p)
        {
            AsignaturaExterna asigEx = Container.NewTransientInstance<AsignaturaExterna>();
            asigEx.Nombre = p;
            asigEx.Estudio = ex;
            Container.Persist<AsignaturaExterna>(ref asigEx);

            ConvalidacionOptativa cn = Container.NewTransientInstance<ConvalidacionOptativa>();            
            cn.TieneAsigExternas = false;
            cn.EstudioExterno = ex;
            Container.Persist<ConvalidacionOptativa>(ref cn);
            
        }

        private void GenerarConvalidacionNormal(EstudioExterno ex, Estudio estudio, String asignaturaPropia, String asignaturaExterna)
        {
            Asignatura asig = Container.NewTransientInstance<Asignatura>();
            asig.Nombre = asignaturaPropia;
            asig.Estudio = estudio;
            Container.Persist<Asignatura>(ref asig);

            AsignaturaExterna asigEx = Container.NewTransientInstance<AsignaturaExterna>();
            asigEx.Nombre = asignaturaExterna;
            asigEx.Estudio = ex;
            Container.Persist<AsignaturaExterna>(ref asigEx);

            ConvalidacionNormal cn = Container.NewTransientInstance<ConvalidacionNormal>();
            cn.Asignatura = asig;
            cn.TieneAsigExternas = true;
            cn.EstudioExterno = ex;
            Container.Persist<ConvalidacionNormal>(ref cn);


            ConvalidacionAsignatura ca = cn.AgregarAsignatura();
            ca.AsignaturaExterna = asigEx;
            Container.Persist<ConvalidacionAsignatura>(ref ca);
        }

    }
}
